Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

239
Views
d3+react.js al hacer clic en el texto del nodo del árbol d3 this.props.history.push da el error "No se pueden leer las propiedades de undefined (leyendo 'props')"

Con la ayuda de d3 y react.js, puedo crear un árbol de jerarquía d3

ingrese la descripción de la imagen aquí

Lo que quiero lograr es que, al hacer clic en cada texto de nodo (p. ej., John, Luke, ...), debería dirigirse a la página de detalles de cada texto en el que se hizo clic.

 nodes .append("text") .attr("font-size", "17px") .attr("text-anchor", "start") .text(function (d) { return `${d.data.name}` }) .on("click", function (event, d) { this.props.history.push(`/detail/${d.id}`); });

constructor

 constructor(props) { super(props); console.log(this.props) // there is history in props this.state = { isClicked: "" }; this.geGraph = this.getGraph.bind(this); // function where graph code presents

después de hacer clic en el texto del nodo. Recibo error.

 Uncaught TypeError: Cannot read properties of undefined (reading 'history')

Además, cuando depuro en línea this.props.history.push , no hay props en this .

Intenté seguir este Cómo usar React Router con gráficos d3.js para redirigir a otra pantalla . Todavía tengo el mismo problema. y cuando trato de ir a la función de flecha

 .on("click", (event, d) => this.props.history.push(`/detail/${d.id}`))

esta vez da un problema para los accesorios Uncaught TypeError: Cannot read properties of undefined (reading 'props')

He agregado el historial en <Route history={createBrowserHistory()}/> y también import { createBrowserHistory } from "history"; . y export default withRouter(MyGraph) importado de import { withRouter } from 'react-router-dom'; .

Estoy usando la versión del enrutador "react-router-dom": "^4.3.1" y componentes basados en clases con mecanografiado.

¿Cómo resuelvo este problema?

¡Gracias por adelantado!

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Está utilizando esto en un alcance diferente , su alcance es funcional ahora, es mejor definir una función para hacer clic dentro del componente y llamarlo en el evento de clic.

O puede almacenar este valor en otra variable dentro del alcance de creación de nodos y usarlo desde allí.

about 4 years ago · Juan Pablo Isaza Report

0

De acuerdo con la documentación de la API DOM de javascript, la referencia a this será el elemento DOM en el que hará clic.

 nodes .append("text") .attr("font-size", "17px") .attr("text-anchor", "start") .text(function (d) { return `${d.data.name}` }) .on("click", function (event, d) { // try console.log here console.log(this); // <--- most likely be a DOM element you clicked this.props.history.push(`/detail/${d.id}`); // <--- therefore this.props does not exist });

Solución 1

use la función de flecha de Javascript:

 .on("click", (event, d) => { console.log(this); // <--- this should refer to the parent object this.props.history.push(`/detail/${d.id}`); });

Solución 2

o vincule el controlador de eventos de clic en el constructor con this

 constructor(props) { super(props); console.log(this.props) this.state = { isClicked: "" }; this.geGraph = this.getGraph.bind(this); this.nodeClickHandler = this.nodeClickHandler.bind(this); } function nodeClickHandler (event, d) { this.props.history.push(`/detail/${d.id}`); }
 nodes .append("text") .attr("font-size", "17px") .attr("text-anchor", "start") .text(function (d) { return `${d.data.name}` }) .on("click", this.nodeClickHandler);
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!